package org.cqust.backend.common;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatus;

/**
 * 通用API响应结果类
 * @param <T> 响应数据的类型
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "通用API响应结果类")
public class ApiResult<T> {
    /**
     * 操作是否成功
     */
    @Schema(description = "操作是否成功", example = "true")
    private Boolean success;

    /**
     * HTTP状态码
     */
    @Schema(description = "HTTP状态码", example = "200")
    private Integer code;

    /**
     * 消息描述
     */
    @Schema(description = "消息描述", example = "操作完成")
    private String message;

    /**
     * 响应数据
     */
    @Schema(description = "响应数据")
    private T data;

    /**
     * 成功时的静态方法，不带数据
     * @return ApiResult<String> 成功响应结果
     */
    @Schema(hidden = true)
    public static ApiResult<String> success() {
        return ApiResult.<String>builder()
                .success(true)
                .code(200)
                .message("操作完成")
                .build();
    }

    /**
     * 成功时的静态方法，带数据
     * @param data 响应数据
     * @param <T> 数据类型
     * @return ApiResult<T> 成功响应结果
     */
    @Schema(hidden = true)
    public static <T> ApiResult<T> success(T data) {
        return ApiResult.<T>builder()
                .success(true)
                .code(HttpStatus.OK.value())
                .data(data)
                .message("操作完成")
                .build();
    }



    /**
     * 错误时的静态方法，带HttpStatus和消息
     * @param status HttpStatus响应码
     * @param message 消息描述
     * @param <T> 数据类型
     * @return ApiResult<T> 错误响应结果
     */
    @Schema(hidden = true)
    public static <T> ApiResult<T> error(HttpStatus status, String message) {
        return ApiResult.<T>builder()
                .success(false)
                .code(status.value())
                .message(message)
                .build();
    }

    /**
     * 错误时的静态方法，带消息
     * @param message 消息描述
     * @param <T> 数据类型
     * @return ApiResult<T> 错误响应结果
     */
    @Schema(hidden = true)
    public static <T> ApiResult<T> error(String message) {
        return ApiResult.<T>builder()
                .success(false)
                .code(HttpStatus.BAD_REQUEST.value())
                .message(message)
                .build();
    }
}